#ifndef _DRV_DB_COMMON_H
#define _DRV_DB_COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include <ctype.h>

#include "sqlite3.h"

// 错误处理宏
#define DB_ERROR(db)																								\
do{																																	\
	fprintf(stderr, "%s %d [ERROR] ", __FILE__, __LINE__);						\
	fprintf(stderr, "%s\n", sqlite3_errmsg(db));	\
}while(0)

#define DB_DB_LOG_ERROR(...) 															\
do{																												\
	fprintf(stderr, "%s %d [ERROR] ", __FILE__, __LINE__);	\
	fprintf(stderr, __VA_ARGS__);														\
	fprintf(stderr, "\n");																	\
}while(0)

#define DB_LOG_INFO(...) 																	\
do{																												\
	printf(__VA_ARGS__);																		\
	printf("\n");																						\
}while(0)

/*预处理语句异常释放*/
#define DB_SAFE_FINALIZE(stmt) do { \
	if(stmt) { \
			sqlite3_finalize(stmt); \
			stmt = NULL; \
	} \
} while(0)

/***************************************************************
* Name:   db_is_valid_identifier()
* Input : name 标识
* Output: void 
* Return: 合格 true
* Author: heweilong
* Revise: V1.1
* Description: 验证标识符合法性（防止SQL注入）
***************************************************************/
bool db_is_valid_identifier(const char* name);

/*列数据结构*/
// 一列值结构体
typedef struct {
	char* column_name;		//数据标识符
	uint8_t data_type;		//数据类型
	union {
		int int_value;
		double float_value;	
		char* text_value;
		struct {
			void* data;
			int size;
		} blob_value;				//大量的二进制数据
	} value;
} db_column_value_t;

// 多列值结构体
typedef struct
{
	db_column_value_t* col;
	size_t col_count;
}db_line_col_t;

/*where判断数据结构*/
/* 比较运算符枚举 */
typedef enum {
	CMP_EQ,		// =
	CMP_NEQ,	// !=
	CMP_GT,		// >
	CMP_LT,		// <
	CMP_GTE,	// >=
	CMP_LTE		// <=
} compa_operator_t;

/***************************************************************
* Name:   db_get_operator_str()
* Input : op 比较运算符
* Output: void 
* Return: 对应的SQL运算符字符串
* Author: heweilong
* Revise: V1.0
* Description:安全获取比较运算符字符串
***************************************************************/
const char* db_get_operator_str(compa_operator_t op);

/* 逻辑操作符枚举 */
typedef enum {
	LOGIC_AND,
	LOGIC_OR,
	LOGIC_NONE  // 用于第一个条件
} logic_operator_t;

/* 增强版条件结构体 */
typedef struct {
	db_column_value_t value;		// 数据值
	logic_operator_t logic_op;	// 逻辑操作符（与前一个条件的关系）
	compa_operator_t cmp_op;		// 比较运算符
	bool is_not;								// 是否取反 对这条判断条件的结果区反
} db_where_condition_t;

/*sql事务*/
// 事务封装函数
typedef int (*db_opt)(sqlite3* db, const char* table_name, const void* data);

/***************************************************************
* Name:   db_transaction_wrapper()
* Input : db 数据库 operation 事务封装函数 table_name 操作的表 user_data用户数据
* Output: void 
* Return: SQLITE_OK 合格
* Author: heweilong
* Revise: V1.1
* Description: 执行事务
***************************************************************/
int db_transaction_wrapper(sqlite3* db, db_opt operation, const char* table_name, const void* user_data);
#endif